/*
 * @Author: your name
 * @Date: 2021-10-26 22:03:41
 * @LastEditTime: 2021-11-15 21:10:42
 * @LastEditors: your name
 * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 * @FilePath: \vue-vben-admin-main\src\store\modules\errorLog.ts
 */
import type { ErrorLogInfo } from '/#/store';

import { defineStore } from 'pinia';
import { store } from '/@/store';

import { formatToDateTime } from '/@/utils/dateUtil';
import projectSetting from '/@/settings/projectSetting';

import { ErrorTypeEnum } from '/@/enums/exceptionEnum';

export interface ErrorLogState {
    errorLogInfoList: Nullable<ErrorLogInfo[]>;
    errorLogListCount: number;
}

export const useErrorLogStore = defineStore({
    id: 'app-error-log',
    state: (): ErrorLogState => ({
        errorLogInfoList: null,
        errorLogListCount: 0,
    }),
    getters: {
        getErrorLogInfoList(): ErrorLogInfo[] {
            return this.errorLogInfoList || [];
        },
        getErrorLogListCount(): number {
            return this.errorLogListCount;
        },
    },
    actions: {
        addErrorLogInfo(info: ErrorLogInfo) {
            const item = {
                ...info,
                time: formatToDateTime(new Date()),
            };
            this.errorLogInfoList = [item, ...(this.errorLogInfoList || [])];
            this.errorLogListCount += 1;
        },

        setErrorLogListCount(count: number): void {
            this.errorLogListCount = count;
        },

        /**
         * Triggered after ajax request error
         * @param error
         * @returns
         */
        addAjaxErrorInfo(error) {
            const { useErrorHandle } = projectSetting;
            if (!useErrorHandle) {
                return;
            }
            const errInfo: Partial<ErrorLogInfo> = {
                message: error.message,
                type: ErrorTypeEnum.AJAX,
            };
            if (error.response) {
                const {
                    config: { url = '', data: params = '', method = 'get', headers = {} } = {},
                    data = {},
                } = error.response;
                errInfo.url = url;
                errInfo.name = 'Ajax Error!';
                errInfo.file = '-';
                errInfo.stack = JSON.stringify(data);
                errInfo.detail = JSON.stringify({ params, method, headers });
            }
            this.addErrorLogInfo(errInfo as ErrorLogInfo);
        },
    },
});

// Need to be used outside the setup
export function useErrorLogStoreWithOut() {
    return useErrorLogStore(store);
}
